package bean;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.Date;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;
import javax.servlet.http.HttpServletRequest;

import org.richfaces.component.UISelect;

import DAO.EsquemaDAO;
import DAO.PacienteDAO;
import Model.Esquema;
import Model.Paciente;
import Utils.Uteis;


public class EsquemaBean {
	private int id;
	private int idPaciente;
	private int idDiasSessao;
	private int idTipoCapilar;
	private Date dataInicio;
	private Date dataFim;
	
	private UISelect idPacienteValidation;
	private UIInput dataInicioValidation;

	private UIInput dataFimValidation;
	
	public UIInput getDataInicioValidation() {
		return dataInicioValidation;
	}
	public UISelect getIdPacienteValidation() {
		return idPacienteValidation;
	}
	public void setIdPacienteValidation(UISelect idPacienteValidation) {
		this.idPacienteValidation = idPacienteValidation;
	}
	public void setDataInicioValidation(UIInput dataInicioValidation) {
		this.dataInicioValidation = dataInicioValidation;
	}
	public UIInput getDataFimValidation() {
		return dataFimValidation;
	}
	public void setDataFimValidation(UIInput dataFimValidation) {
		this.dataFimValidation = dataFimValidation;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getIdPaciente() {
		return idPaciente;
	}
	public void setIdPaciente(int idPaciente) {
		this.idPaciente = idPaciente;
	}
	public int getIdDiasSessao() {
		return idDiasSessao;
	}
	public void setIdDiasSessao(int idDiasSessao) {
		this.idDiasSessao = idDiasSessao;
	}
	public int getIdTipoCapilar() {
		return idTipoCapilar;
	}
	public void setIdTipoCapilar(int idTipoCapilar) {
		this.idTipoCapilar = idTipoCapilar;
	}
	public Date getDataInicio() {
		return dataInicio;
	}
	public void setDataInicio(Date dataInicio) {
		this.dataInicio = dataInicio;
	}
	public Date getDataFim() {
		return dataFim;
	}
	public void setDataFim(Date dataFim) {
		this.dataFim = dataFim;
	}	
	
	public String Salvar()
	{	
		Esquema esquema = new Esquema();
		try
		{
			java.sql.Date dataInicio= Uteis.javaDate2SqlDate(this.getDataInicio());
			
			if(this.id > 0)
			{
				esquema = EsquemaDAO.LoadObject(this.id);
				if(esquema != null && (esquema.getIdPaciente() != this.idPaciente))
				{
					FacesContext facesContext = FacesContext.getCurrentInstance();
					facesContext.addMessage("Alerta!", new FacesMessage(FacesMessage.SEVERITY_WARN, "Alerta!", "Não é permitido mudar o paciente!"));
					return "esquema_list";
				}
			}
			
			esquema.setDataInicio(dataInicio);
			esquema.setIdDiasSessao(this.getIdDiasSessao());
			esquema.setIdTipoCapilar(this.getIdTipoCapilar());
			esquema.setIdPaciente(this.getIdPaciente());			

			if(this.getDataFim() != null)
				esquema.setDataFim(Uteis.javaDate2SqlDate(this.getDataFim()));
			else
				esquema.setDataFim(null);
			
			if(this.id > 0)
			{
				esquema.setIdEsquema(this.getId());
				EsquemaDAO.Update(esquema);				
			}
			else
			{
				if(EsquemaDAO.verificaEsquemaPaciente(this.idPaciente) == false) // Não pode haver mais de um esquema para o mesmo paciente
				{
					EsquemaDAO.Insert(esquema);
				}
				else
				{
					FacesContext facesContext = FacesContext.getCurrentInstance();
					facesContext.addMessage("sucesso", new FacesMessage(FacesMessage.SEVERITY_WARN, "Alerta!", "Já existe um esquema cadastrado para esse paciente."));
					return "esquema_list";
				}
			}		
			FacesContext facesContext = FacesContext.getCurrentInstance();
			facesContext.addMessage("sucesso", new FacesMessage(FacesMessage.SEVERITY_INFO, "Sucesso!", "Informações Salvas com sucesso."));				
		
		}		
		catch(ParseException pexc)
		{
			pexc.printStackTrace();
			FacesContext facesContext = FacesContext.getCurrentInstance();
			facesContext.addMessage("erro", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro!", "Ocorreu um problema ao salvar as informações, contate o administrador do sistema"));
		}		
		catch(SQLException sexc)
		{
			sexc.printStackTrace();
			FacesContext facesContext = FacesContext.getCurrentInstance();
			facesContext.addMessage("erro", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro!", "Ocorreu um problema ao salvar as informações, contate o administrador do sistema"));
		}				 
		return "esquema_list";		
	}
	
	public String Editar()
	{
		HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
		Esquema esquema = null;
		int id =  Integer.parseInt(request.getParameter("idesquema"));		
		try
		{
			esquema = EsquemaDAO.LoadObject(id);			
			if (esquema != null)
			{
				this.setDataFim(esquema.getDataFim());
				this.setDataInicio(esquema.getDataInicio());
				this.setId(esquema.getIdEsquema());
				this.setIdDiasSessao(esquema.getIdDiasSessao());
				this.setIdPaciente(esquema.getIdPaciente());
				this.setIdTipoCapilar(esquema.getIdTipoCapilar());
				return "esquema_edit";
			}
		}
		catch(SQLException ex)
		{
			ex.printStackTrace();			
		}		
		return "esquema_list";
	}	
	
	public String Deletar()
	{
		HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
		int id = Integer.parseInt(request.getParameter("idesquema"));		
		
		try
		{
			EsquemaDAO.Delete(id);
			FacesContext facesContext = FacesContext.getCurrentInstance();
			facesContext.addMessage("sucesso", new FacesMessage(FacesMessage.SEVERITY_INFO, "Sucesso!", "Informações Deletadas com sucesso"));

		}
		catch(SQLException sqlex)		
		{
			FacesContext facesContext = FacesContext.getCurrentInstance();
			facesContext.addMessage("erro", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro!", "Ocorreu um problema ao salvar as informações, contate o administrador do sistema"));
		}
		
		return "esquema_list";
	}	
	
	public void validaDataFutura(FacesContext context, UIComponent uicomponent, Object value)
	{		
		Date dataSelecionada = (Date) value;
		if(dataSelecionada.after(new Date()))
		{
			((UIInput)uicomponent).setValid(false);
			FacesMessage message = new FacesMessage();
			message.setDetail("A data não pode estar no futuro");        
			message.setSeverity(FacesMessage.SEVERITY_ERROR);	        
			throw new ValidatorException(message);
		}
		else
		{			
			Object objDatataFim = this.dataFimValidation.getSubmittedValue();
			if(objDatataFim != null && objDatataFim != "")
			{					
				Date dataFim = null;
				try {
					dataFim = Uteis.string2UtilDate(objDatataFim.toString());
				} catch (ParseException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
				if(dataFim != null)
				{
					if(dataFim.before(dataSelecionada))
					{
						((UIInput)uicomponent).setValid(false);
						FacesMessage message = new FacesMessage();
						message.setDetail("A data de ínicio não pode ser maior que a data de término! ");        
						message.setSeverity(FacesMessage.SEVERITY_ERROR);
						throw new ValidatorException(message);
					}
				}					
			}
			
			Object idPacienteSelect = this.idPacienteValidation.getLocalValue();	
			if(idPacienteSelect != null && idPacienteSelect != "")
			{
				int idPaciente = Integer.parseInt(this.idPacienteValidation.getLocalValue().toString());
				Paciente paciente = null;
				
				try {
					paciente = PacienteDAO.LoadObject(idPaciente);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				if(paciente != null)
				{
					if(dataSelecionada.before(paciente.getDataNascimento()))
					{
						String data = Uteis.formatarData(paciente.getDataNascimento());
						((UIInput)uicomponent).setValid(false);
						FacesMessage message = new FacesMessage();					
						message.setDetail("A data não pode ser menor que "+ data +" que é data de nascimento do paciente! ");
						message.setSeverity(FacesMessage.SEVERITY_ERROR);	        
						throw new ValidatorException(message);
					}					
				}
			}
			else
			{
				((UIInput)uicomponent).setValid(false);
			}				
		}
		
	}
}
